package com.mall.generator.domain;

import com.mall.common.constant.GenConstants;
import com.mall.common.core.domain.BaseEntity;
import com.mall.common.utils.StringUtils;
import java.util.List;
import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import org.apache.commons.lang3.ArrayUtils;


/**
 * 业务表 gen_table
 * Created by zhonglin on 2020/4/8.
 */
public class GenTable
    extends BaseEntity {

  private static final long serialVersionUID = 1L;

  /**
   * 编号
   */
  private Long tableId;

  /**
   * 表名称
   */
  @NotBlank(message = "表名称不能为空")
  private String tableName;

  /**
   * 表描述
   */
  @NotBlank(message = "表描述不能为空")
  private String tableComment;

  /**
   * 实体类名称(首字母大写)
   */
  @NotBlank(message = "实体类名称不能为空")
  private String className;

  /**
   * 使用的模板（crud单表操作 tree树表操作）
   */
  private String tplCategory;

  /**
   * 生成包路径
   */
  @NotBlank(message = "生成包路径不能为空")
  private String packageName;

  /**
   * 生成模块名
   */
  @NotBlank(message = "生成模块名不能为空")
  private String moduleName;

  /**
   * 生成业务名
   */
  @NotBlank(message = "生成业务名不能为空")
  private String businessName;

  /**
   * 生成功能名
   */
  @NotBlank(message = "生成功能名不能为空")
  private String functionName;

  /**
   * 生成作者
   */
  @NotBlank(message = "作者不能为空")
  private String functionAuthor;

  /**
   * 主键信息
   */
  private GenTableColumn pkColumn;

  /**
   * 表列信息
   */
  @Valid
  private List<GenTableColumn> columns;

  /**
   * 其它生成选项
   */
  private String options;

  /**
   * 树编码字段
   */
  private String treeCode;

  /**
   * 树父编码字段
   */
  private String treeParentCode;

  /**
   * 树名称字段
   */
  private String treeName;

  public Long getTableId() {

    return tableId;
  }

  public void setTableId(Long tableId) {

    this.tableId = tableId;
  }

  public String getTableName() {

    return tableName;
  }

  public void setTableName(String tableName) {

    this.tableName = tableName;
  }

  public String getTableComment() {

    return tableComment;
  }

  public void setTableComment(String tableComment) {

    this.tableComment = tableComment;
  }

  public String getClassName() {

    return className;
  }

  public void setClassName(String className) {

    this.className = className;
  }

  public String getTplCategory() {

    return tplCategory;
  }

  public void setTplCategory(String tplCategory) {

    this.tplCategory = tplCategory;
  }

  public String getPackageName() {

    return packageName;
  }

  public void setPackageName(String packageName) {

    this.packageName = packageName;
  }

  public String getModuleName() {

    return moduleName;
  }

  public void setModuleName(String moduleName) {

    this.moduleName = moduleName;
  }

  public String getBusinessName() {

    return businessName;
  }

  public void setBusinessName(String businessName) {

    this.businessName = businessName;
  }

  public String getFunctionName() {

    return functionName;
  }

  public void setFunctionName(String functionName) {

    this.functionName = functionName;
  }

  public String getFunctionAuthor() {

    return functionAuthor;
  }

  public void setFunctionAuthor(String functionAuthor) {

    this.functionAuthor = functionAuthor;
  }

  public GenTableColumn getPkColumn() {

    return pkColumn;
  }

  public void setPkColumn(GenTableColumn pkColumn) {

    this.pkColumn = pkColumn;
  }

  public List<GenTableColumn> getColumns() {

    return columns;
  }

  public void setColumns(List<GenTableColumn> columns) {

    this.columns = columns;
  }

  public String getOptions() {

    return options;
  }

  public void setOptions(String options) {

    this.options = options;
  }

  public String getTreeCode() {

    return treeCode;
  }

  public void setTreeCode(String treeCode) {

    this.treeCode = treeCode;
  }

  public String getTreeParentCode() {

    return treeParentCode;
  }

  public void setTreeParentCode(String treeParentCode) {

    this.treeParentCode = treeParentCode;
  }

  public String getTreeName() {

    return treeName;
  }

  public void setTreeName(String treeName) {

    this.treeName = treeName;
  }

  public boolean isTree() {

    return isTree(this.tplCategory);
  }

  public static boolean isTree(String tplCategory) {

    return tplCategory != null && StringUtils.equals(GenConstants.TPL_TREE, tplCategory);
  }

  public boolean isCrud() {

    return isCrud(this.tplCategory);
  }

  public static boolean isCrud(String tplCategory) {

    return tplCategory != null && StringUtils.equals(GenConstants.TPL_CRUD, tplCategory);
  }

  public boolean isSuperColumn(String javaField) {

    return isSuperColumn(this.tplCategory, javaField);
  }

  public static boolean isSuperColumn(String tplCategory,
                                      String javaField) {

    if (isTree(tplCategory)) {
      return StringUtils.equalsAnyIgnoreCase(javaField, ArrayUtils.addAll(GenConstants.TREE_ENTITY, GenConstants.BASE_ENTITY));
    }
    return StringUtils.equalsAnyIgnoreCase(javaField, GenConstants.BASE_ENTITY);
  }

}